package com.zjsru.plan2023.oneday.oneDay202301;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author: CookLee
 * @Date: 2023/1/19
 *
 * 强密码检验器 II
 *
 * 如果一个密码满足以下所有条件，我们称它是一个 强 密码：
 *
 * 它有至少 8 个字符。
 * 至少包含 一个小写英文 字母。
 * 至少包含 一个大写英文 字母。
 * 至少包含 一个数字 。
 * 至少包含 一个特殊字符 。特殊字符为："!@#$%^&*()-+" 中的一个。
 * 它 不 包含 2 个连续相同的字符（比方说 "aab" 不符合该条件，但是 "aba" 符合该条件）。
 * 给你一个字符串 password ，如果它是一个 强 密码，返回 true，否则返回 false 。
 *
 *
 * 输入：password = "IloveLe3tcode!"
 * 输出：true
 * 解释：密码满足所有的要求，所以我们返回 true 。
 *
 * 输入：password = "Me+You--IsMyDream"
 * 输出：false
 * 解释：密码不包含数字，且包含 2 个连续相同的字符。所以我们返回 false 。
 *
 * 输入：password = "1aB!"
 * 输出：false
 * 解释：密码不符合长度要求。所以我们返回 false 。
 *
 */
public class StrongPasswordCheckerII {
    
    
    public boolean strongPasswordCheckerII(String password) {
        if (password.length() < 8) {
            return false;
        }
        
        Set<Character> specials = new HashSet<Character>() {
            private static final long serialVersionUID = 1557014624426435339L;
    
            {
            this.add('!');
            this.add('@');
            this.add('#');
            this.add('$');
            this.add('%');
            this.add('^');
            this.add('&');
            this.add('*');
            this.add('(');
            this.add(')');
            this.add('-');
            this.add('+');
        }};
        int n = password.length();
        boolean hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
        for (int i = 0; i < n; ++i) {
            if (i != n - 1 && password.charAt(i) == password.charAt(i + 1)) {
                return false;
            }
            
            char ch = password.charAt(i);
            if (Character.isLowerCase(ch)) {
                hasLower = true;
            } else if (Character.isUpperCase(ch)) {
                hasUpper = true;
            } else if (Character.isDigit(ch)) {
                hasDigit = true;
            } else if (specials.contains(ch)) {
                hasSpecial = true;
            }
        }
        
        return hasLower && hasUpper && hasDigit && hasSpecial;
    }
    
    public static void main(String[] args) {
        StrongPasswordCheckerII strongPasswordCheckerII = new StrongPasswordCheckerII();
        String password = "IloveLe3tcode!";
        System.out.println(strongPasswordCheckerII.strongPasswordCheckerII(password));
    }
}
